package cn.mujiankeji.mbrowser.界面.标签页.快照

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.app.应用路由
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.工具.操作.快照操作
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.数据库.DBQzm
import cn.mujiankeji.mbrowser.数据.数据库.DBQzmBag
import cn.mujiankeji.mbrowser.数据.数据库.快照规则简要
import cn.mujiankeji.mbrowser.数据.枚举类.快照类型枚举
import cn.mujiankeji.mbrowser.界面.图标.MyIconPack
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.加
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.后退
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.文件夹
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.更多
import cn.mujiankeji.mbrowser.界面.小窗页.文本编辑窗口状态
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import cn.mujiankeji.mbrowser.界面.组件.布局.项目卡片
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.core.component.KoinComponent
import org.koin.core.context.GlobalContext
import 操作.工具类.时间操作
import 数据.枚举类.错误类型
import 界面.弹窗.下拉删除确认
import 界面.弹窗.下拉菜单
import 界面.弹窗.下拉菜单项目

class 快照管理页面状态() : 标签页状态(),KoinComponent {
    var coroutine : CoroutineScope ?= null
    val database : AppDatabase by lazy { GlobalContext.get().get() }

    val 订阅列表 = mutableStateListOf<DBQzmBag>()
    var 选中订阅包 by mutableStateOf<DBQzmBag?>(null)
    val 快照规则项目 = mutableStateListOf<快照规则简要>()
    init {
        super.标题.value = "快照管理"
        super.地址.value = "mbrowser://snapshot"
    }

    suspend fun 加载列表(){
        withContext(Dispatchers.IO){
            launch {
                database.快照包().获取所有订阅Flow().collect{
                    订阅列表.clear()
                    订阅列表.addAll(it)
                }
            }
        }
    }

    fun 请求创建快照规则() {
        文本编辑窗口状态(提示值 = {"名称"}, 检测 = {
            if (it.isEmpty()) 错误类型.名称为空
            else if (database.快照().检测名称可否使用(it) == 0) null
            else 错误类型.名称重复
        }){
            it?.let {
                coroutine?.launch {
                    val db = DBQzm(名称 = it, 类型 = 快照类型枚举.列表)
                    db.id = database.快照().插入规则(db)
                    应用路由.加载(快照编辑页面状态(db.id,db.bid))
                }

            }

        }
    }

    fun 请求创建快照订阅包(){
        文本编辑窗口状态(提示值 = {"名称"}, 检测 = {
            if (it.isEmpty()) 错误类型.名称为空
            else if (database.快照包().检测名称可否使用(it) == 0) null
            else 错误类型.名称重复
        }){
            it?.let {
                coroutine?.launch {
                    val n = DBQzmBag(名称 = it)
                    n.id = database.快照包().插入订阅(DBQzmBag(名称 = it))
                    选中订阅包 = n
                }
            }

        }
    }

    fun 请求添加网络订阅(){
        文本编辑窗口状态(提示值 = {"输入订阅地址"}){
            it?.let {
                if (地址操作.是否有效URL(it)){
                    coroutine?.launch {
                        快照操作.添加订阅(地址操作.标准化URL(it))
                    }
                }
            }
        }
    }

    fun 删除订阅包(db : DBQzmBag){
        coroutine?.launch {
            database.快照().删除合集(db.uid)
            database.快照包().删除订阅(db)
        }
    }

    fun 编辑项目(item : 快照规则简要){
        应用路由.加载(快照编辑页面状态(item.id,item.bid))
    }

}


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun 快照管理页面实现(state : 快照管理页面状态){
    state.coroutine = rememberCoroutineScope()
    DisposableEffect(Unit) {
        onDispose {
            state.coroutine?.cancel()
            state.coroutine = null
        }
    }

    // 加载
    LaunchedEffect(Unit) {
        state.加载列表()
    }

    // 加载快照规则
    LaunchedEffect(state.选中订阅包) {
        state.快照规则项目.clear()
        state.database.快照().获取所有规则简要(state.选中订阅包?.uid?:return@LaunchedEffect).collect{
            state.快照规则项目.clear()
            state.快照规则项目.addAll(it)
        }
    }


    Scaffold(topBar = {
        topbar(state)
    }) {paddingValue->
        Column(modifier = Modifier.padding(top = paddingValue.calculateTopPadding())) {
            listview(state)
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun topbar(state: 快照管理页面状态){
    TopAppBar(
        title = {
            if (state.选中订阅包 == null){
                Text("快照管理")
            }
            else {

                Row {

                    Text("所有",
                        modifier = Modifier.clip(MaterialTheme.shapes.extraSmall)
                            .clickable {
                                state.选中订阅包 = null
                            }
                            .padding(5.dp,3.dp))


                    Text(">   " + state.选中订阅包!!.名称,
                        modifier = Modifier.clip(MaterialTheme.shapes.extraSmall)
                            .padding(5.dp,3.dp))

                }

            }
        },
        navigationIcon = {
            if (state.选中订阅包 != null){
                IconButton({state.选中订阅包 = null}) {
                    Icon(MyIconPack.后退,"返回")
                }
            }
        },
        actions = {

            var showAddMenu by remember { mutableStateOf(false) }
            IconButton({
                if (state.选中订阅包 != null) showAddMenu = true
                else state.请求创建快照规则()
            }) {
                Icon(MyIconPack.加,"添加",)
                下拉菜单(showAddMenu,{showAddMenu = false}){
                    下拉菜单项目("创建集合包"){
                        showAddMenu = false
                        state.请求创建快照订阅包()
                    }
                    下拉菜单项目("创建快照规则"){
                        state.请求创建快照规则()
                        showAddMenu = false
                    }
                }
            }

            var showMoreMenu by remember { mutableStateOf(false) }
            IconButton({
                showMoreMenu = true
            }) {
                Icon(MyIconPack.更多,"更多")
                下拉菜单(showMoreMenu,{showMoreMenu = false}){
                    下拉菜单项目("订阅快照"){
                        showMoreMenu = false
                        state.请求添加网络订阅()
                    }
                    if (state.选中订阅包 != null){
                        var 删除确认 by remember { mutableStateOf(false) }
                        下拉菜单项目("删除订阅"){
                            showMoreMenu = false
                            删除确认 = true
                        }
                        下拉删除确认(删除确认){
                            if (it){
                                state.删除订阅包(state.选中订阅包!!)
                            }
                        }
                    }
                }
            }

        },
        colors = TopAppBarDefaults.topAppBarColors().copy(containerColor = MaterialTheme.colorScheme.background))
}

@Composable
private fun listview(state: 快照管理页面状态){

    LazyColumn(Modifier.fillMaxSize()) {

        if (state.选中订阅包 == null){
            items(state.订阅列表){
                订阅包项目(state,it)
            }
        }

        items(state.快照规则项目){
            快照规则项目(state,it)
        }

    }
}

@Composable
private fun 订阅包项目(state : 快照管理页面状态,item : DBQzmBag){
    项目卡片({state.选中订阅包 = item}) {
        Row(Modifier.fillMaxWidth(),
            verticalAlignment = Alignment.CenterVertically){

            Icon(MyIconPack.文件夹,"", modifier = Modifier.size(28.dp),
                tint = MaterialTheme.colorScheme.secondary)

            Spacer(Modifier.width(15.dp))

            Column(Modifier.fillMaxWidth()){

                Text(item.名称, style = MaterialTheme.typography.titleSmall,
                    maxLines = 1)

                Spacer(Modifier.height(6.dp))

                Text(时间操作.时间戳到文本(item.更新时间), style = MaterialTheme.typography.labelMedium)

            }
        }
    }

}

@Composable
private fun 快照规则项目(state : 快照管理页面状态,item : 快照规则简要){

    项目卡片({state.编辑项目(item)}){
        Row(Modifier.fillMaxWidth(),
            verticalAlignment = Alignment.CenterVertically){
            Column(Modifier.fillMaxWidth()){

                Text(item.名称, style = MaterialTheme.typography.titleSmall,
                    maxLines = 1)

                Spacer(Modifier.height(6.dp))

                Text(item.类型.toString() + " " + item.匹配地址, style = MaterialTheme.typography.labelMedium,
                    maxLines = 1)

            }
        }
    }


}